#ifndef _LOG_
#define _LOG_

//================================================================================================================================
//================================================================================================================================
// Qt
#include <QtCore/QFile>
#include <QtCore/QDate>
#include <QtCore/QTime>
#include <QtCore/QTimer>
#include <QtCore/QString>
#include <QtCore/QTextStream>
// Локальные
#include "service_global.h"

//================================================================================================================================
//================================================================================================================================
/// Класс, позволяющий вести запись о различных событиях в лог-файл.
class SERVICE_EXPORT Log : public QObject
{
    Q_OBJECT

public:
    /// Получение доступа к системе логов.
    static Log* instance()
    {
        Q_ASSERT_X(m_Instance != NULL, "Log::instance", "Log object are not initialized");
        return m_Instance;
    }

    /// Инициализация и старт системы ведения логов.
    static void init(int save_interval, const QString &filepath)
    {
        deinit();
        m_Instance = new Log();
        m_Instance->m_LogFile = new QFile(filepath);
        m_Instance->m_LogText = new QString();
        m_Instance->m_Timer = new QTimer();

        connect(m_Instance->m_Timer, SIGNAL(timeout()), m_Instance, SLOT(updateLogFile()));
        m_Instance->m_Timer->start(save_interval);
    }

    /// Остановка системы ведения логов.
    static void deinit()
    {
        if(m_Instance != NULL)
        {
            delete m_Instance->m_Timer;
            delete m_Instance->m_LogFile;
            delete m_Instance;
            m_Instance = NULL;
        }
    }

    /// Добавить запись в журнал.
    //
    /// К записи автоматически добавляется информация о дате и времени.
    void logEvent(const QString& event_text)
    {
        QDate date = QDate::currentDate();
        QTime time = QTime::currentTime();

        *m_LogText += QString("%1.%2.%3    ").arg(date.day()).arg(date.month()).arg(date.year());
        *m_LogText += QString("%1:%2:%3    ").arg(time.hour()).arg(time.minute()).arg(time.second());
        *m_LogText += event_text;
        *m_LogText += "\n";
    }

private slots:
    /// Добавить накопленные записи в файл.
    void updateLogFile()
    {
        QTextStream ostream(m_LogFile);
        m_LogFile->open(QFile::Append | QFile::Text);
        ostream << m_LogText;
        m_LogFile->close();
        m_LogText->clear();
    }

private:
    // Запрещаем явно создавать/удалять объекты класса.
    Log(){}
    ~Log(){}

    QString *m_LogText;         ///< Текст, записываемый в лог файл.
    QTimer *m_Timer;            ///< Таймер, для переодической записи логов.
    QFile *m_LogFile;           ///< Файл, в который будут записываться логи.

    static Log *m_Instance;     ///< Единственный доступный экземпляр класса.
};

#endif // _LOG_
